/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.knolle.vistas;

import java.awt.Color;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Date;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList;
import org.marcelo.agro.core.api.InterfaceCampanhas;
import org.openide.WizardDescriptor;
import org.openide.util.HelpCtx;
import org.openide.util.Lookup;

public class CampaniasWizardPanel1 implements WizardDescriptor.Panel<WizardDescriptor>, PropertyChangeListener {

    /**
     * The visual component that displays this panel. If you need to access the
     * component from this class, just use getComponent().
     */
    private CampaniasVisualPanel1 component;
    private Boolean isValid = true;
    private WizardDescriptor model;
    private Color color = Color.PINK;
    private InterfaceCampanhas ic = Lookup.getDefault().lookup(InterfaceCampanhas.class);
    private final EventListenerList listeners = new EventListenerList();
    // Get the visual component for the panel. In this template, the component
    // is kept separate. This can be more efficient: if the wizard is created
    // but never displayed, or not all panels are displayed, it is better to
    // create only those which really need to be visible.
    @Override
    public CampaniasVisualPanel1 getComponent() {
        
        if (component == null) {
            component = new CampaniasVisualPanel1();   
        }
        return component;
    }

    @Override
    public HelpCtx getHelp() {
        // Show no Help button for this panel:
        return HelpCtx.DEFAULT_HELP;
        // If you have context help:
        // return new HelpCtx("help.key.here");
    }

    @Override
    public boolean isValid() {
        // If it is always OK to press Next or Finish, then:
        
        return isValid;
        // If it depends on some condition (form filled out...) and
        // this condition changes (last form field filled in...) then
        // use ChangeSupport to implement add/removeChangeListener below.
        // WizardDescriptor.ERROR/WARNING/INFORMATION_MESSAGE will also be useful.
        //Tengo que validar que las fechas de inicio y fin sean fechas
        //tengo que validar que la fecha de fin sea mayo que la fecha inicio
        //tengo que validar que El nombre no sea muy corto, nada mas
    }
    
    @Override
    public void addChangeListener(ChangeListener l) {
        listeners.add(ChangeListener.class, l);
    }

    @Override
    public void removeChangeListener(ChangeListener l) {
        listeners.remove(ChangeListener.class, l);
    }
    
    protected final void fireChangeEvent(
        Object source, boolean oldState, boolean newState) {
            if(oldState != newState) {
                ChangeEvent ev = new ChangeEvent(source);
                    for (ChangeListener listener : listeners.getListeners(ChangeListener.class)) {
                        listener.stateChanged(ev);
                    }
            }
    }

    @Override
    public void readSettings(WizardDescriptor wiz) {
        // use wiz.getProperty to retrieve previous panel state
        model = wiz;
        getComponent().addPropertyChangeListener(this);
    }

    @Override
    public void storeSettings(WizardDescriptor wiz) {
        // use wiz.putProperty to remember current panel state
        CampaniasVisualPanel1 componente =getComponent();
        wiz.putProperty(CampaniasVisualPanel1.PROPIEDAD_NOMBRE, componente.getCampoNombre().getText());
        wiz.putProperty(CampaniasVisualPanel1.PROPIEDAD_FECHA_INICIO, componente.getCampoFechaInicio().getDate());
        wiz.putProperty(CampaniasVisualPanel1.PROPIEDAD_FECHA_FIN, componente.getCampoFechaFin().getDate());
        wiz.putProperty(CampaniasVisualPanel1.PROPIEDAD_ESTA_ACTIVO, componente.getCheckEstaActivo().isSelected());
        wiz.putProperty(CampaniasVisualPanel1.PROPIEDAD_DESCRIPCION, componente.getCampoDescripcion().getText());
    }
    
 

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        boolean oldState = isValid;
        isValid   = checkValidity();
        fireChangeEvent(this, oldState, isValid);
//        if (evt.getPropertyName().equals( CampaniasVisualPanel1.PROPIEDAD_NOMBRE) ){
//            //validar el nombre
//            String nombre = getComponent().getCampoNombre().getText();
//            if (nombre.isEmpty()) {
//                setMessage("El nombre no puede estar vacio",true);
//                getComponent().getCampoNombre().setBackground(color);
//                isValid = Boolean.FALSE;
//            }
//            else if (!ic.esUnico(nombre)) {
//                setMessage("Ya existe un elemento con el mismo nombre",true);
//                getComponent().getCampoNombre().setBackground(color);
//                isValid = Boolean.FALSE;
//            }
//            else{
//                isValid = Boolean.TRUE;
//                getComponent().getCampoNombre().setBackground(Color.WHITE);
//            }
//        }
//        else if (evt.getPropertyName().equals( CampaniasVisualPanel1.PROPIEDAD_FECHA_INICIO) ){
//             JFormattedTextField editorFechaInicio = getComponent().getCampoFechaInicio().getEditor();
//             Date fechaInicio = getComponent().getCampoFechaInicio().getDate();
//             Date fechaFin = getComponent().getCampoFechaFin().getDate(); 
//            if (null == fechaInicio){
//                setMessage("La fecha de inicio no puede estar en blanco",true);
//                getComponent().getCampoFechaInicio().getEditor().setBackground(color);
//                isValid = Boolean.FALSE;
//            }
//            else if (fechaFin != null && fechaFin.before(fechaInicio)) {
//                setMessage("La fecha de fin no puede ser menor a la fecha de inicio",true);
//                getComponent().getCampoFechaFin().getEditor().setBackground(color);
//                isValid = Boolean.FALSE;
//            }
//            else {
//                isValid = Boolean.TRUE;
//                getComponent().getCampoFechaInicio().getEditor().setBackground(Color.WHITE);
//            }
//        }
//        else if (evt.getPropertyName().equals( CampaniasVisualPanel1.PROPIEDAD_FECHA_FIN) ) {
//            Date fechaInicio = getComponent().getCampoFechaInicio().getDate(); 
//            Date fechaFin = getComponent().getCampoFechaFin().getDate();    
//            if (null == fechaFin){
//                setMessage("La fecha de fin no puede estar en blanco",true);
//                getComponent().getCampoFechaFin().getEditor().setBackground(color);
//                isValid = Boolean.FALSE;
//            }
//        
//            else if (fechaInicio != null && fechaFin.before(fechaInicio)) {
//                setMessage("La fecha de fin no puede ser menor a la fecha de inicio",true);
//                getComponent().getCampoFechaFin().getEditor().setBackground(color);
//                isValid = Boolean.FALSE;
//            }
//            else {
//                isValid = Boolean.TRUE;
//                getComponent().getCampoFechaFin().getEditor().setBackground(Color.WHITE);
//            }
//        }
//        if (isValid)
//            model.getNotificationLineSupport().clearMessages();
    }
    
    private void setMessage(String message, Boolean tipo) {
        if (tipo)
            model.getNotificationLineSupport().setErrorMessage(message);
        else {
            model.getNotificationLineSupport().setInformationMessage(message);
        }
    }
    
    /**
     * Metodo para determinar que datos son validos y cuales invalidos
     * falta pulir por que en primera parte no limpia los coloreados cuando hay datos invalidos
     * @return 
     */
    private Boolean checkValidity() {
        String nombre = getComponent().getCampoNombre().getText();
        Date fechaInicio = getComponent().getCampoFechaInicio().getDate(); 
        Date fechaFin = getComponent().getCampoFechaFin().getDate(); 
        //Comensar a preguntar
        
        if (nombre.isEmpty()) {
            setMessage("El nombre no puede estar vacio",true);
            getComponent().getCampoNombre().setBackground(color);
            isValid = false;
        }
        else { 
            if (!ic.esUnico(nombre)) {
                setMessage("Ya existe un elemento con el mismo nombre",true);
                getComponent().getCampoNombre().setBackground(color);
                isValid = false;
            }
            else {
                getComponent().getCampoNombre().setBackground(Color.WHITE);
                isValid = true;
            }
        }
        if (null == fechaInicio){
            setMessage("La fecha de inicio no puede estar en blanco",true);
            getComponent().getCampoFechaInicio().getEditor().setBackground(color);
            isValid = false;
        }
        else if (null == fechaFin){
            setMessage("La fecha de fin no puede estar en blanco",true);
            getComponent().getCampoFechaFin().getEditor().setBackground(color);
            isValid = false;
        }
        else if (fechaFin.before(fechaInicio)) {
            getComponent().getCampoFechaInicio().getEditor().setBackground(Color.WHITE);
            setMessage("La fecha de fin no puede ser menor a la fecha de inicio",true);
            getComponent().getCampoFechaFin().getEditor().setBackground(color);
            isValid = false;
        }
        else {
            getComponent().getCampoFechaFin().getEditor().setBackground(Color.WHITE);
            isValid = true;
        }
        if (isValid)
            model.getNotificationLineSupport().clearMessages();
        return isValid;
    }
    
}
